package edu.cque.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author Hua
 * @create 2022-07-15 23:38
 * 服务消费方对象 ,通过此对象 发送 服务消费端请求
 * <p>
 * 当使用@EnableFeignClients注解描述配置类时,
 * 主要用于告诉spring框架,要对使用@FeignClient注解描述的接口创建实现类及其对象
 */
//@Import(String.class)//导入第三方没有被Spring容器管理的bean对象
@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);

    }

  /*
    基于此对象实现远端服务调用
    因为spring容器初始化时,没有创建这个对象,所以我们自己创建,然后交给spring管理
    在spring中配置第三方bean时,可以通过@bean的方式,对指定方法进行描述,然后在方法内部进行对象的创建和配置
    @bean描述的方法,其返回值会交给spring管理,spring会给这个bean一个默认的名字,默认为方法名
      <<作用域为单例作用域>>
   */

    @Bean
//    @ConditionalOnMissingBean  //spring容器没有这个bean时他才会生效
    public RestTemplate restTemplate324() {
        return new RestTemplate();
    }

    /*
    @LoadBalanced注解是属于Spring，而不是Ribbon的，
    Spring在初始化容器的时候，如果检测到Bean被@LoadBalanced注解，Spring会为其设置LoadBalancerInterceptor的拦截器。
     */
    @Bean
    @LoadBalanced
    public RestTemplate loadBalancedRestTemplate() {
        return new RestTemplate();
    }

}
